package com.dongdongshop.service.impl;

import com.dongdongshop.pojo.TbItem;
import com.dongdongshop.pojo.TbOrderItem;
import com.dongdongshop.service.CartService;
import com.dongdongshop.service.ItemService;
import com.dongdongshop.vo.Cart;
import com.dongdongsop.constant.CartConstant;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

@Service
@DubboService
public class CartServiceImpl implements CartService {

    @DubboReference
    private ItemService itemService;

    @Resource
    private RedisTemplate redisTemplate;

    @Override
    public List<Cart> addCart(List<Cart> cartList, Long skuId, Integer num) {
        //1、根据skuId查询sku数据（tb-item）
        TbItem item = itemService.selectById(skuId);
        //2、判断数据是哪个商家的
        //获取商家ID
        String sellerId = item.getSellerId();
        Cart oldCart = getCartFromCartListBySellerId(cartList, sellerId);
        //2.1、如果不是，创建一个新的购物车，然后将数据放进去
        if (oldCart == null) {
            oldCart = new Cart();
            oldCart.setSellerId(sellerId);
            //创建一个list接收商品
            List<TbOrderItem> orderItemList = new ArrayList<>();
            //创建orderItemList对象用来接收item数据
            TbOrderItem orderItem = new TbOrderItem();
            orderItem.setSellerId(sellerId);
            orderItem.setNum(num);
            orderItem.setGoodsId(item.getGoodsId());
            orderItem.setPrice(item.getPrice());
            //小计 当前商品的数量 * 当前商品的单价
            orderItem.setTotalFee(new BigDecimal(item.getPrice().doubleValue() * num));
            orderItem.setTitle(item.getTitle());
            orderItem.setPicPath(item.getImage());
            orderItem.setItemId(item.getId());
            //将新建的购物明细数据，放到购物明细列表中
            orderItemList.add(orderItem);
            //将购物车明细列表数据，放到购物中
            oldCart.setOrderItemList(orderItemList);
            //将购物车放到购物列表中
            cartList.add(oldCart);
        } else {
            //2.2、如果是：如果我们以前购物车中买过这家商家的商品的话
            //2.2.1、如果是这家商家的同一家商品
            List<TbOrderItem> orderItemList = oldCart.getOrderItemList();
            TbOrderItem orderItem = getOrderItemFromOrderListByItemId(orderItemList, item.getId());
            if (orderItem == null) {
                orderItem = new TbOrderItem();
                orderItem.setSellerId(sellerId);
                orderItem.setNum(num);
                orderItem.setGoodsId(item.getGoodsId());
                orderItem.setPrice(item.getPrice());
                //小计 当前商品的数量 * 当前商品的单价
                orderItem.setTotalFee(new BigDecimal(item.getPrice().doubleValue() * num));
                orderItem.setTitle(item.getTitle());
                orderItem.setPicPath(item.getImage());
                orderItem.setItemId(item.getId());
                //将新商品追加到明细列表中
                orderItemList.add(orderItem);
            } else {
                //2.2.2、如果我们只买过这家商家的商品，但和上次买的不是同一个商品
                //我们只需要修改商品的数量与小计
                orderItem.setNum(orderItem.getNum() + num);
                orderItem.setTotalFee(new BigDecimal(orderItem.getNum() * item.getPrice().doubleValue()));
                //如果我们减完商品的数量之后，商品数量为0了，就把他从明细列表中移除
                if (orderItem.getNum().intValue() <= 0) {
                    orderItemList.remove(orderItem);
                }
                //如果移除后明细列表没有数据了，那么我们就将当前商家的购物车从购物车中移除
                if (orderItemList.size() <= 0) {
                    cartList.remove(oldCart);
                }
            }

        }
        return cartList;
    }

    //根据商家ID从原来的购物中查询购物车数据
    private Cart getCartFromCartListBySellerId(List<Cart> cartList, String sellerId) {
        for (Cart cart : cartList) {
            if (cart.getSellerId().equals(sellerId)) {
                return cart;
            }
        }
        return null;
    }

    //根据商品的ID从原来商家的购物车明细列表查询有没有买过这件商品
    private TbOrderItem getOrderItemFromOrderListByItemId(List<TbOrderItem> orderItemList, Long itemId) {
        for (TbOrderItem orderItem : orderItemList) {
            if (orderItem.getItemId().equals(itemId)) {
                return orderItem;
            }
        }
        return null;
    }

    @Override
    public List<Cart> selectCartListFromRedis(Long id) {
        List<Cart> cartList = (List<Cart>) redisTemplate.boundHashOps(CartConstant.CARTREDIS).get(id);
        return cartList == null ? new ArrayList<>() : cartList;
    }

    @Override
    public void addCartListToRedis(List<Cart> cartList, Long id) {
        redisTemplate.boundHashOps(CartConstant.CARTREDIS).put(id, cartList);
    }

    //合并购物车
    @Override
    public List<Cart> mergeCartList(List<Cart> cartList, List<Cart> cartListFormRedis) {
        for (Cart cart : cartList) {
            List<TbOrderItem> orderItemList = cart.getOrderItemList();
            for (TbOrderItem orderItem : orderItemList) {
                cartListFormRedis = addCart(cartListFormRedis, orderItem.getItemId(), orderItem.getNum());
            }
        }
        return cartListFormRedis;
    }

    @Override
    public void deleteCartListFromRedis(Long id) {
        redisTemplate.boundHashOps(CartConstant.CARTREDIS).delete(id);
    }
}
